#include<stdio.h>
typedef unsigned int uint32_t;
typedef unsigned char uint8_t;
union bit32_data
{
    uint32_t data;
    struct
    {
        uint8_t byte0;
        uint8_t byte1;
        uint8_t byte2;
        uint8_t byte3;
    }byte;
};
#define    GET_LOW_BYTE0(x)    ((x >>  0) & 0x000000ff)    /* 获取第0个字节 */
#define    GET_LOW_BYTE1(x)    ((x >>  8) & 0x000000ff)    /* 获取第1个字节 */
#define    GET_LOW_BYTE2(x)    ((x >> 16) & 0x000000ff)    /* 获取第2个字节 */
#define    GET_LOW_BYTE3(x)    ((x >> 24) & 0x000000ff)    /* 获取第3个字节 */

#define    CLEAR_LOW_BYTE0(x)    (x &= 0xffffff00)    /* 清零第0个字节 */
#define    CLEAR_LOW_BYTE1(x)    (x &= 0xffff00ff)    /* 清零第1个字节 */
#define    CLEAR_LOW_BYTE2(x)    (x &= 0xff00ffff)    /* 清零第2个字节 */
#define    CLEAR_LOW_BYTE3(x)    (x &= 0x00ffffff)    /* 清零第3个字节 */

#define    SET_LOW_BYTE0(x)  (x |= 0x000000ff)    /* 第0个字节置1 */
#define    SET_LOW_BYTE1(x)  (x |= 0x0000ff00)    /* 第1个字节置1 */
#define    SET_LOW_BYTE2(x)  (x |= 0x00ff0000)    /* 第2个字节置1 */
#define    SET_LOW_BYTE3(x)  (x |= 0xff000000)    /* 第3个字节置1 */

#define    GET_BIT(x, bit)    ((x & (1 << bit)) >> bit)    /* 获取第bit位 */
#define    CLEAR_BIT(x, bit)    (x &= ~(1 << bit))        /* 清零第bit位 */
#define    SET_BIT(x, bit)    (x |= (1 << bit))            /* 置位第bit位 */
#define BIT_M_TO_N(x, m, n)  ((unsigned int)(x << (31-(n))) >> ((31 - (n)) + (m)))   /* 获取第[n:m]位的值  eg 第二位到第三位:[2:3] */


///大小端转换
// 4bytes、32bit数据大小端转化
#define L2B32(Little) (((Little & 0xff) << 24) | (((Little) & 0xff00) << 8) | (((Little) & 0xff0000) >> 8) | ((Little >> 24) & 0xff))
// 2bytes、16bit数据大小端转化
#define L2B16(Little) (((Little & 0xff) << 8) | ((Little >> 8) & 0xff))

int main(void)
{
    union bit32_data num;
    num.data = 0x12345678;
    for (int i = 0; i < 32; i++) {
        printf("%d-", GET_BIT(num.data, i)); //小端逆序
    }
    printf("byten=m 0x%x\n",BIT_M_TO_N(num.data, 4, 7));
    printf("0x%x\n", num.data);
    uint32_t revert_data =  L2B32(num.data);
    printf("0x%x\n",revert_data);
    for (int i = 0; i < 32; i++) {
        printf("%d-", GET_BIT(revert_data, i)); //小端逆序
    }
    printf("byte0=0x%x\n",num.byte.byte0);
    printf("byte1=0x%x\n",num.byte.byte1);
    printf("byte2=0x%x\n",num.byte.byte2);
    printf("byte3=0x%x\n",num.byte.byte3);
    printf("byte3=0x%x\n", GET_LOW_BYTE0(num.data));
    CLEAR_LOW_BYTE0(num.data);
    printf("byte0=0x%x\n", GET_LOW_BYTE0(num.data));
    SET_LOW_BYTE0(num.data);
    printf("byte0=0x%x\n", GET_LOW_BYTE0(num.data));

    return 0;
}